package satk.database;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import satk.objetos.Institucion;
import satk.beans.interfaces.IntControlManagerDB;
import satk.objetos.Usuario;

/**
 * <h3>ManagerUsuarios.java</h3>
 * <div><em>Fecha de creación: 2/05/2011, 12:10:44 PM.</em></div>
 * <p></p>
 * @author Sergio Flores Genis <sf.cancun@gmail.com>
 */
public class ManagerUsuarios extends DBManager
        implements IntControlManagerDB<Usuario> {

    private boolean externalCnn = false;

    public ManagerUsuarios() {
        super();
    }

    public ManagerUsuarios(java.sql.Connection c) {
        super(c);
    }

    @Override
    public List<Usuario> getAll() {
        String query = "SELECT * FROM system_user NATURAL JOIN system_role;";
        List<Usuario> list = null;
        try {
            ResultSet r = this.select(query);
            list = new LinkedList<Usuario>();
            while (r.next()) {
                int identificador = r.getInt("idsystem_user");
                String nombre = r.getString("namesystem_user");
                String rol = r.getString("namesystem_role");
                int idInst = r.getInt("c_institucion_idc_institucion");
                Institucion inst = new ManagerInstitucion(getConexion()).getById(idInst);
                Usuario us = new Usuario(nombre, rol, inst);
                us.setIdentificador(identificador);
                list.add(us);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.SEVERE,
                    "Error al obtener los usuarios", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerInstitucion.class.getName()).log(Level.WARNING,
                    "Exepcion desconosida", ex);
        } finally {
            if (list == null || list.isEmpty()) {
                list = new LinkedList<Usuario>();
            }
            if (!externalCnn) {
                closeConexion();
            }
        }
        return list;

    }

    @Override
    public Usuario getById(long id) {
        String query = "SELECT * FROM system_user NATURAL JOIN system_role WHERE (idsystem_user = ?);";
        Prepare p = new Prepare(1);
        p.add(id, Types.INTEGER);

        Usuario u = null;
        try {
            ResultSet r = this.select(query, p);
            r.first();

            int identificador = r.getInt("idsystem_user");
            String nombre = r.getString("namesystem_user");
            String rol = r.getString("namesystem_role");
            int idInst = r.getInt("c_institucion_idc_institucion");

            Institucion inst = null;
            if (idInst > 0) {
                inst = new ManagerInstitucion(getConexion()).getById(idInst);
            }
            u = new Usuario(nombre, rol, inst);
            u.setIdentificador(identificador);

        } catch (SQLException ex) {
            Logger.getLogger(ManagerUsuarios.class.getName()).log(Level.SEVERE,
                    "Error al obtener al usuario", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerUsuarios.class.getName()).log(Level.WARNING,
                    "Exepcion desconosida", ex);
        } finally {
            if (externalCnn) {
                this.closeConexion();
            }
        }
        return u;
    }
    public Usuario getByName(String name){
        String query = "SELECT * FROM system_user NATURAL JOIN system_role WHERE (namesystem_user = ?);";
        Prepare p = new Prepare(1);
        p.add(name, Types.VARCHAR);

        Usuario u = null;
        try {
            ResultSet r = this.select(query, p);
            r.first();

            int identificador = r.getInt("idsystem_user");
            String nombre = r.getString("namesystem_user");
            String rol = r.getString("namesystem_role");
            int idInst = r.getInt("c_institucion_idc_institucion");

            Institucion inst = null;
            if (idInst > 0) {
                inst = new ManagerInstitucion(getConexion()).getById(idInst);
            }
            u = new Usuario(nombre, rol, inst);
            u.setIdentificador(identificador);

        } catch (SQLException ex) {
            Logger.getLogger(ManagerUsuarios.class.getName()).log(Level.SEVERE,
                    "Error al obtener al usuario", ex);
        } catch (Exception ex) {
            Logger.getLogger(ManagerUsuarios.class.getName()).log(Level.WARNING,
                    "Exepcion desconosida", ex);
        } finally {
            if (externalCnn) {
                this.closeConexion();
            }
        }
        return u;
    }

    @Override
    public int add(Usuario o) throws SQLException {
        String queryUse1 = "INSERT INTO system_user"
                + " (namesystem_user, passsystem_user, c_institucion_idc_institucion)"
                + " VALUES (?, MD5(?), ?);";
        String queryRol2 = "INSERT INTO system_role (namesystem_user, namesystem_role) VALUES (?, ?);";

        Prepare p1 = new Prepare(3);
        p1.setStringTransform(Prepare.STRING_DEFAULT);
        p1.add(o.getNombreUsuario(), Types.VARCHAR);
        p1.add(o.getPassword(), Types.VARCHAR);
        if (o.getInstitucion() != null) {
            p1.add(o.getInstitucion().getIdentificador(), Types.INTEGER);
        } else {
            p1.add(null, Types.NULL);
        }
        int respUser = this.edit(queryUse1, p1);
        int idUser = this.getLastIdInsert();
        o.setIdentificador(idUser);

        Prepare p2 = new Prepare(2);
        p2.setStringTransform(Prepare.STRING_DEFAULT);
        p2.add(o.getNombreUsuario(), Types.VARCHAR);
        p2.add(o.getRol(), Types.VARCHAR);
        int respRol = this.edit(queryRol2, p2);
        if (!externalCnn) {
            closeConexion();
        }
        return respRol;
    }

    @Override
    public int update(Usuario o, Usuario n) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int remove(Usuario o) throws SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}
